package main

import "fmt"

type myfun1 func(a int) int
type myfun2 func() int

func main() {
	fmt.Println("匿名函数")
	a := "hi a"
	b := 10
	//匿名函数定义1
	f1 := func() int {
		fmt.Println(a)
		return 1
	}
	f1()
	var myfun1_new1 myfun2 = f1

	re := myfun1_new1()
	fmt.Println(re)

	//匿名函数定义2 匿名函数必须调用
	func() {
		fmt.Println("niming function2", a)
	}()
	d := func(a, b, c int) (re int) {
		return a + b + c
	}(1, 2, 3)
	fmt.Println(d)

	e := func(a int) (int) {
		fmt.Println("匿名函数使用外部变量:", b)
		if (a <= 0) {
			return a
		} else {
			var sum int = 0
			//for循环体结构体部分不要用()括起来
			for ; a > 0; a-- {
				sum += a
			}
			return sum
		}
	}(6)
	fmt.Println(e)

	//匿名函数 闭包里面的变量在每次调用完不会恢复
	fmt.Println(test1())
	fmt.Println(test1())
	fmt.Println(test1())

	test2_new1 := test2()
	fmt.Println(test2_new1())
	fmt.Println(test2_new1())
	fmt.Println(test2_new1())
	//匿名函数 闭包里面的变量在每次调用完不会恢复

}

func test1() int {
	var x int
	x++
	return x * x
}
func test2() func() int {
	var x int
	return func() int {
		x++
		return x * x
	}
}
